package gui;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Image;
import java.util.Observable;
import java.util.Observer;

import javax.swing.ImageIcon;
import javax.swing.JLabel;

import modelo.Auto;
import modelo.Bloque;
import modelo.Semaforo;

public class BloqueVista extends JLabel implements Observer {
	
	private static final String[] COLORES = {"azul", "rojo", "gris"};
	private static final long serialVersionUID = 1L;
	private String imgbase;

	public BloqueVista(Bloque bloque) {
		super();
		this.setOpaque(true);
		this.setFont(new Font("Arial", 1, 14));
		this.setHorizontalAlignment(JLabel.CENTER);
		this.setPreferredSize(new Dimension(35, 35));
		this.initBloque(bloque);
	}
	
	private void initBloque(Bloque bloque) {
		if(bloque != null) {
			this.setNombreImagenBase(bloque);
			this.setSinAuto();
			bloque.addObserver(this);
		} else {
			this.setBackground(new Color(0, 200, 100));
		}
	}

	protected void setNombreImagenBase(Bloque bloque) {
		String nombre = "";
		if (bloque.tieneSemaforo()) {
			nombre += "semaforo-";
		}
		if (bloque.getInterseccion()) {
			nombre += "interseccion-";
		}
		nombre += bloque.getSentido().getNombre();
		this.imgbase = nombre;
	}
	
	protected String getColorAuto(Integer id){
		Integer len = COLORES.length;
		Integer val = id % len;
		return COLORES[val];
	}

	protected void setConAuto(Auto auto) {
		this.setIcon(new ImageIcon("images/" + this.imgbase + "-auto-" + this.getColorAuto(auto.getIdAuto()) + 
				"-" + auto.getDireccion().getNombre() + ".gif"));
	}
	
	protected void setSinAuto() {
		this.setIcon(new ImageIcon("images/" + this.imgbase + ".gif"));
	}
	
	public void setColorSemaforo(Integer color) {
		if (color.equals(Semaforo.VERDE)) {
			this.setBackground(Color.GREEN);
		} else if (color.equals(Semaforo.AMARILLO)) {
			this.setBackground(Color.YELLOW);
		} else if (color.equals(Semaforo.ROJO)) {
			this.setBackground(Color.RED);
		}
	}

	@Override
	public synchronized void update(Observable arg0, Object arg1) {
		Bloque bloq = (Bloque) arg0;
		if (arg1 == null) {
			if (bloq.estaOcupado()) {
				this.setConAuto(bloq.getAuto());
			} else {
				this.setSinAuto();
			}
		} else {
			this.setColorSemaforo((Integer) arg1);
		}
	}

}
